<?php

namespace App\Http\Controllers\Resources;

use App\Models\Company;
use App\Models\Group;
use App\Models\Project;
use App\Models\User;
use App\Services\ServiceFactory;
use Dotenv\Validator;
use Illuminate\Http\Request;
use Auth;
use App\Http\Requests;
use App\Http\Requests\GroupRequest;
use App\Http\Requests\GroupUpdateRequest;
use App\Http\Controllers\Controller;
use App\Services\Interfaces\RepoServiceInterface;
use Illuminate\Support\Facades\Input;

class GroupController extends Controller
{
    public function __construct($_resource)
    {
        $this->_resource= $_resource;
    }

    /**
     * Display a listing of the resource.
     *账号列表
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //当前登录用户为操作员的话,无权限创建
        //$this->authorize(new Group());
        $res = $this->_repoService()->read();
        return $res;
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //当前登录用户为操作员的话,无权限创建
        $this->authorize('create', new Group());
    }

    /**
     * 创建组织架构
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(GroupRequest $request)
    {
        //获取传递过来的信息
        $data = [];
        foreach (Group::InputFiled as $key => $default) {
            $data[$key] = $request->input($key, $default);
        }
        if (empty($data['parent_id'])) {//在管理后台创建渠道的时候会自动穿件一个公司账号，为最高层,parent_id为0，此账号只能在创建渠道的时候才能添加，其他时候不能
            return $this->_error('没有上级');
        }
        // 同一级下面的名称不能为相同
        $parent_ids = Group::where('name', $data['name'])->get()->pluck('parent_id')->all();
        if (!empty($data['parent_id'])) {
            if (in_array($data['parent_id'], $parent_ids)) {
                return $this->_error('此级下有相同的名称');
            }
            // 如果根据提交过来的group_id能查询到项目, 则不允许创建业务结构，由于传递过来的parent_id就是上一级的ID，当绑定项目的时候，会将ID以group_id为key放进Project表中
            $projects = Project::where('group_id', $data['parent_id'])->get();
            $count = $projects->count();
            if ($count > 0) {
                return $this->_error('此业务结构有项目,不能创建子集!');
            }
            $res = $this->_repoService()->create($data);
            return $res;
        }

    }

    /**
     * Display the specified resource.
     * 获取组织架构详情
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //当前登录用户为操作员的话,无权限创建
        //$this->authorize('show', new Group());
        $res = $this->_repoService()->find(['id' => $id]);
        if ($res)
            return $res;
        else
            return $this->_error('没有找到指定的group!');
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //当前登录用户为操作员的话,无权限创建
        $this->authorize('edit', new Group());
    }

    /**
     * Update the specified resource in storage.
     * 编辑组织架构
     * @param  \Illuminate\Http\Request $request
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function update(GroupUpdateRequest $request, $id)
    {
        $user = Auth::User();
        $userGroupId = $user->group_id;//获取当前用户的group_id
        $group = new Group();
        $groups = $group->getLeafBy($userGroupId);//获取当前用户的所有数据
        if (is_array($groups)) {
            $group_ids = array_column($groups, '_id');
        } else {
            $group_id = $groups->id;
            $group_ids = array($group_id);
        }
        $data = $request->all();
        $pIds = Group::where('name', $data['name'])
            ->get()
            ->pluck('parent_id')
            ->all();
        //dd($pId);
        //$data['name'];
        // 同一级下面的名子不能相同
        $groupModel = Group::find($id);
        if (!empty($groupModel)) {
            $name = $groupModel->name;
        } else {
            return $this->_error('找不到相关数据');
        }
        $parent_id = $groupModel->parent_id;
        if (!empty($pIds)) {
            if ($pIds[0] === $parent_id && $name !== $data['name']) {//要修改的名称不能等于当前已有的名称,由于子集是不能有相同名称的，所以$pIds只有一个
                return $this->_error('此级下面有相同的名称');
            }
            if (in_array($id, $group_ids)) {//当传递过来的ID在当前用户的子数据中的时候
                $isSave = $this->_repoService()->update(['_id' => $id], $data);
                if ($isSave) {
                    return $this->show($id);
                } else {
                    return $this->_error('修改失败');
                }
            }
        } else {
            $isSave = $this->_repoService()->update(['_id' => $id], $data);
            if ($isSave) {
                return $this->show($id);
            } else {
                return $this->_error('修改失败');
            }
        }
    }

    /**
     * Remove the specified resource from storage.
     * 删除组织架构
     * @param  int $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //当前登录用户为操作员的话,无权限创建
        $this->authorize('destroy', new Group());
        $group = Group::find($id);
        $children = $group->children;
        if (!empty($children)) {//只能删除最下级结构，当children为空时才是最下级结构
            return $this->_error('此组织架构不是最下级');
        }
        $users = User::where('group_id', $id)//创建账号的时候会有一个组织架构，如果该组织绑定了相关账号则不能删除
        ->get()
            ->pluck('_id')
            ->all();
        if (!empty($users)) {
            return $this->_error('此组织结构上面有添加的账号');
        }
        $wx_id = Project::where('group_id', $id)//如果绑定了项目而且该项目绑定了微信也不能删除
        ->get()
            ->pluck('wx_id')
            ->all();
        $wx_id = array_flatten($wx_id);//方法将多维数组转化为1维数组
        if (!empty($wx_id)) {
            return $this->_error('此组织的项目上面有微信号');
        }
        $res = $this->_repoService()->delete(['id' => $id]);
        if ($res) {
            return "删除成功";
        } else {
            return $this->_error('删除失败');
        }

    }
}
